perm filename PASS5[901,BGB] blob sn#129621 filedate 1974-11-12 generic text, type T, neo UTF8
00100	TITLE PASS5
00200	EXTERNAL INPUT5,INPUT6,FFLAG,OUTPDL,END6
00300	INTERNAL PASS5
00400	;ACCUMULATORS
00500	XL←←0
00600	YL←←1
00700	XH←←2
00800	YH←←3
00900	X1←←B←←4
01000	Y1←←5
01100	X2←←CC←←6
01200	Y2←←CCC←←Q←←7
01300	XM←←AAA←←10
01400	YM←←BBB←←11
01500	XN←←AA←←12
01600	YN←←BB←←13
01700	X←←14
01800	Y←←15
01900	P←←16
02000	A←←17
02100	KPLANE←20000
     

00100	PASS5:	0
00200		MOVEI P,INPUT5-1
00300		MOVE A,OUTPDL
00400		SUBI A,INPUT5-1
00500		MOVNS A
00600		HRL P,A
00700		MOVEM P,TEM1#
00800		MOVEI P,INPUT6
00900	LOOP:	HRRZ A,P
00905		SUBI A,END6
00910		SKIPL A
00915		JRST EXIT5	;OUTPUT BUFFER OVERFLOW.
00920		EXCH P,TEM1
01000		AOBJP P,EXIT5
01100		MOVE A,(P)
01200		AOBJP P,EXIT5
01300		HLRE XL,(P)
01400		HRRE YL,(P)
01500		MOVE XH,XL
01600		MOVE YH,YL
01700		HLRZ X,A
01800		ANDI X,177777
01900		ADD XH,X
02000		ADD YH,X
02100	
02200		EXCH P,TEM1
02300	
02310		SKIPE FFLAG	;TEST FRAME FLAG
02320		JSR FRAME
02330	
02400		TLNE A,600000
02500		JRST INTERS
02600	
02700		HRL A,4(A)	;PENETRATOR
02800	DEFINE UNPACK (N,M) {
02900	MOVE Y1,N-1(A)
03000	MOVE Y2,M-1(A)
03100	HLRE X1,Y1
03200	HLRE X2,Y2
03300	HRRES Y1
03400	HRRES Y2
03500	JSR CLIP
03600	⎇
03700	TLNE A,4
03800	JRST [UNPACK 2,3
03900		JRST .+1]
04000	TLNE A,2
04100	JRST [UNPACK 1,3
04200		JRST .+1]
04300	TLNE A,1
04400	JRST [UNPACK 1,2
04500		JRST .+1]
04600	JRST LOOP
04700	
04800	
04900	;INTERSECTING PLANES AND SURROUNDERS AND CORNERS
05000	INTERS:	EXCH P,TEM1
05100		AOBJP P,EXIT5
05200		MOVE B,(P)
05300		EXCH P,TEM1
05400		HLRE AA,11(A)
05500		HRRE BB,11(A)
05600		HLRE CC,12(A)
05700		HLRE AAA,11(B)
05800		HRRE BBB,11(B)
05900		HLRE CCC,12(B)
06000	
06100		MOVM X,CC
06200		MOVM Y,CCC
06300		CAML X,Y
06400		JRST [EXCH CC,CCC
06410			EXCH AA,AAA
06420			EXCH BB,BBB
06430			JRST .+1
06440			]
06500		SKIPN CCC
06600		JRST LOOP
06610		ASH CC,22
06700		IDIVM CC,CCC
06710		HRLZI CC,1
06720		SUB CC,CCC
06730		IMULI CC,KPLANE
06740		ASH CC,-22
06800		IMUL AAA,Q
06900		IMUL BBB,Q
06910		ASH AAA,-22
06920		ASH BBB,-22
07000		SUB AA,AAA
07100		SUB BB,BBB
07200		MOVM X,AA
07300		MOVM Y,BB
07400		CAMG X,Y
07500		JRST INTERP
07600	
07700		MOVEI X1,CC
07800		MOVE Y1,YL
07900		IMUL Y1,BB
08000		SUB X1,Y1
08100		IDIV X1,AA
08200		MOVE Y1,YL
08300	
08500		MOVE Y2,YH
08600		IMUL Y2,BB
08700		SUB X2,Y2
08800		IDIV X2,AA
08900		MOVE Y2,YH
09000		JSR CLIP
09100		JRST LOOP
     

00100	INTERP:	MOVEI Y1,KPLANE
00200		MOVE X1,XL
00300		IMUL X1,AA
00400		SUB Y1,X1
00500		IDIV Y1,BB
00600		MOVE X1,XL
00700		MOVEI Y2,KPLANE
00800		MOVE X2,XH
00900		IMUL X2,AA
01000		SUB Y2,X2
01100		IDIV Y2,BB
01200		MOVE X2,XH
01300		JSR CLIP
01400		JRST LOOP
     

00100	DEFINE FRAM $ (A,B,C,D) {
00110	MOVE X1,X$A
00120	MOVE Y1,Y$B
00130	SUB X1,X$C
00140	SUB Y1,Y$D
00150	HRL Y1,X1
00160	HRR Y,Y$D
00170	HRL Y,X$C
00180	PUSH P,Y
00190	PUSH P,Y1
00200	⎇
00210	FRAME:	0
00220	FRAM L,H,L,L
00230	FRAM H,H,L,H
00240	FRAM H,L,H,H
00250	FRAM L,L,H,L
00260	JRST @FRAME
00300	
00400	EXIT5:	EXCH P,TEM1
00500		MOVNS P	;LEFT HALF WORD APPEARS COMPLEMENTED & DECREMENTED
00600		HLLM P,INPUT6
00700		MOVEI P,INPUT6
00800		HRRM P,INPUT6
00900		JRST @PASS5
     

00100	;PASS5 LINE SEGMENT CLIPPING ROUTINE
00200	CLIP:	0
00300		HRREI X,-14
00400		MOVEM X,LIMIT2#
00500	CLIP3:	AOSL LIMIT2
00600		JRST @CLIP
00700	;EXIT IF BOTH END-POINTS ARE OUTSIDE
00800		CAMGE X1,XH	;BOTH ABOVE XH
00900		JRST .+3
01000		CAML X2,XH
01100		JRST @CLIP
01200		CAMGE Y1,YH	;BOTH ABOVE YH
01300		JRST .+3
01400		CAML Y2,YH
01500		JRST @CLIP
01600		CAMLE X1,XL	;BOTH BELOW XL
01700		JRST .+3
01800		CAMG X2,XL
01900		JRST @CLIP
02000		CAMLE Y1,YL	;BOTH BELOW YL
02100		JRST .+3
02200		CAMG Y2,YL
02300		JRST @CLIP
02400	
02500		CAMLE X1,XH	;IS (X1,Y1) WITHIN  
02600		JRST NO1
02700		CAMLE XL,X1
02800		JRST NO1
02900		CAMLE Y1,YH
03000		JRST NO1
03100		CAMLE YL,Y1
03200		JRST NO1
03300		CAMLE X2,XH	;IS (X2,Y2) WITHIN  
03400		JRST NO2
03500		CAMLE XL,X2
03600		JRST NO2
03700		CAMLE Y2,YH
03800		JRST NO2
03900		CAMLE YL,Y2
04000		JRST NO2
04100	CLIP2:	SUB X2,X1	;BOTH POINTS WITHIN; DISPLAY & EXIT.
04200		SUB Y2,Y1
04300		HRL Y1,X1
04400		HRL Y2,X2
04500		PUSH P,Y1
04600		PUSH P,Y2
04700		JRST @CLIP
04800	
04900	NO2:	MOVE XN,X1	;1 IN, 2 OUT.
05000		MOVE YN,Y1
05100		JSR N2
05200		JRST CLIP2
05300	
05400	NO1:	CAMLE X2,XH	;IS (X2,Y2) WITHIN 
05500		JRST NO3
05600		CAMLE XL,X2
05700		JRST NO3
05800		CAMLE Y2,YH
05900		JRST NO3
06000		CAMLE YL,Y2
06100		JRST NO3
06200		MOVE XM,X2	;2 IN, 1 OUT.
06300		MOVE YM,Y2
06400		JSR M1
06500		JRST CLIP2
06600	
06700	NO3:	MOVE XM,X1	;CALCULATE MIDPOINT
06800		MOVE YM,Y1
06900		ADD XM,X2
07000		ADD YM,Y2
07100		ASH XM,-1
07200		ASH YM,-1
07300		CAMLE XM,XH	;IS (XM,YM) WITHIN  
07400		JRST NO4
07500		CAMLE XL,XM
07600		JRST NO4
07700		CAMLE YM,YH
07800		JRST NO4
07900		CAMLE YL,YM
08000		JRST NO4
08100		MOVE XN,XM
08200		MOVE YN,YM
08300		JSR N2
08400		JSR M1
08500		JRST CLIP2
08600	
08700	NO4:	CAMGE X1,XH	;BOTH ABOVE XH
08800		JRST .+3
08900		CAML XM,XH
09000		JRST NO5
09100		CAMGE Y1,YH	;BOTH ABOVE YH
09200		JRST .+3
09300		CAML YM,YH
09400		JRST NO5
09500		CAMLE X1,XL	;BOTH BELOW XL
09600		JRST .+3
09700		CAMG XM,XL
09800		JRST NO5
09900		CAMLE Y1,YL	;BOTH BELOW YL
10000		JRST .+3
10100		CAMG YM,YL
10200		JRST NO5
10300		MOVE X2,XM
10400		MOVE Y2,YM
10500		JRST CLIP3
10600	NO5:	MOVE X1,XM
10700		MOVE Y1,YM
10800		JRST CLIP3
10900	
     

00100	N2:	0	;N IS IN, 2 IS OUT.
00200		HRREI X,-13
00300		MOVEM X,LIMIT#
00400	N2C:	AOSL LIMIT
00500		JRST @N2
00600		MOVE X,XN	;MIDPOINT
00700		MOVE Y,YN
00800		ADD X,X2
00900		ADD Y,Y2
01000		ASH X,-1
01100		ASH Y,-1
01200		CAME X,XN	;EXIT ON MATCH
01300		JRST N2B
01400		CAME Y,YN
01500		JRST N2B
01600	N2A:	MOVE X2,XN	;EXIT
01700		MOVE Y2,YN
01800		JRST @N2
01900	N2B:	CAME X,X2
02000		JRST .+3
02100		CAMN Y,Y2
02200		JRST N2A
02300		CAMLE X,XH	;IS (X,Y) WITHIN  
02400		JRST NON2
02500		CAMLE XL,X
02600		JRST NON2
02700		CAMLE Y,YH
02800		JRST NON2
02900		CAMLE YL,Y
03000		JRST NON2
03100		MOVE XN,X	;MIDPOINT WITHIN
03200		MOVE YN,Y
03300		JRST N2C
03400	NON2:	MOVE X2,X	;MIDPOINT OUTSIDE
03500		MOVE Y2,Y
03600		JRST N2C
     

00100	M1:	0	;M IS IN, 1 IS OUT.
00200		HRREI X,-13
00300		MOVEM X,LIMIT#
00400	M1C:	AOSL LIMIT
00500		JRST @M1
00600		MOVE X,XM	;MIDPOINT
00700		MOVE Y,YM
00800		ADD X,X1
00900		ADD Y,Y1
01000		ASH X,-1
01100		ASH Y,-1
01200		CAME X,XM	;EXIT ON MATCH
01300		JRST M1B
01400		CAME Y,YM
01500		JRST M1B
01600	M1A:	MOVE X1,XM	;EXIT
01700		MOVE Y1,YM
01800		JRST @M1
01900	M1B:	CAME X,X1
02000		JRST .+3
02100		CAMN Y,Y1
02200		JRST M1A
02300		CAMLE X,XH	;IS (X,Y) WITHIN  
02400		JRST NOM1
02500		CAMLE XL,X
02600		JRST NOM1
02700		CAMLE Y,YH
02800		JRST NOM1
02900		CAMLE YL,Y
03000		JRST NOM1
03100		MOVE XM,X	;MIDPOINT WITHIN
03200		MOVE YM,Y
03300		JRST M1C
03400	NOM1:	MOVE X1,X	;MIDPOINT OUTSIDE
03500		MOVE Y1,Y
03600		JRST M1C
03700	
03800	END